/** @odoo-module **/

import { registry } from "@web/core/registry";
import { Layout } from "@web/search/layout"; // Layout组件是用来写 页面顶部控制面板的
import { getDefaultConfig } from "@web/views/view";
import { useService } from "@web/core/utils/hooks"; //在组件中导入服务。服务：服务是提供功能的长期存在的代码片段。
import { Domain } from "@web/core/domain";
import { Card } from "./card/card";
import { PieChart } from "./pie_chart/pie_chart";
import { sprintf } from "@web/core/utils/strings";
import { Component, useSubEnv, onWillStart } from "@odoo/owl";

class AwesomeDashboard extends Component {
  setup() {
    // useSubEnv可以创建子环境，将一个已有的OWL环境划分为多个子环境，每个子环境都有自己的本体和规则。
    // 在子环境中，可以定义新的本体类、属性和关系，也可以使用已有的本体元素。子环境中的本体元素是相对独立的，不会影响到其他子环境或整个大环境中的本体。
    // 在一些复杂环境中，为了避免潜在的冲突以及实现更精细的控制，需要单独设置一个子环境
    useSubEnv({ 
      config: {
        ...getDefaultConfig(), //前端Web视图相关的，用于获取视图的默认配置信息。它是Odoo中前端模块的一部分，主要用于自定义和配置Web视图的行为、外观和功能。
        ...this.env.config
      }
    })

    this.display = {
      controlPanel: { "top-right": false, "bottom-right": false }
    }

    this.action = useService("action")
    // this.rpc = useService("rpc") // rpc可以像调用本地函数一样调用远程函数。也可以异步请求，使用：rpc(route, params, settings)
    this.tshirtService = useService("tshirtService")

    this.keyToString = {
      average_quantity: "本月t恤订单的平均数量",
      average_time: "订单从“新建”到“发送”或“取消”的平均时间",
      nb_cancelled_orders: "本月取消订单的数量",
      nb_new_orders: "本月新订单数量",
      total_amount: "本月新订单的总金额"
    }
    // 在 onWillStart 钩子中调用统计路由 /awesome_tshirt/statistics
     onWillStart(async ()=> {
      // this.statistics = await this.rpc("/awesome_tshirt/statistics")
      this.statistics = await this.tshirtService.loadStatistics(); 
      // console.log(this.statistics)    
     })
  } 
  // 打开 包含所有客户的看板视图
  openCustomerView() {
    // 通过doAction动作可以打开指定的视图
    this.action.doAction("base.action_partner_form") // base.action_partner_form 是 客户视图（已经存在）
  }
  // 打开订单视图
  openOrders(title, domain) {
    this.action.doAction({
      type: "ir.actions.act_window",
      name: title,
      res_model: "awesome_tshirt.order",
      domain: new Domain(domain).toList(), // toList方法可以将实例转换为一个列表
      views: [
        [false, "list"],
        [false, "form"],
      ],
    });
  }

  // 打开一个列表视图，显示最近7天内创建的订单
  openLast7DaysOrders() {
    const domain = "[('create_date', '>=', (context_today() - datetime.timedelta(days=7)).strftime('%Y-%m-%d'))]" //context_today是odoo的一个上下文函数，用于获取当前日期和时间。返回datetime对象
    this.openOrders("最近7天订单", domain)
  }
  // 打开一个视图，显示最近7天取消的订单
  openLast7DaysCancelledOrders() {
    const domain = "[('create_date', '>=', (context_today() - datetime.timedelta(days=7)).strftime('%Y-%m-%d')), ('state', '=', 'cancelled')]"
    this.openOrders("最近7天创建的订单", domain)
  }
  // 打开指定尺寸的订单列表
  openFilteredBySizeOrders(size) {
    const title = sprintf("展示尺码为%s的订单", size) //同ES6语法`${}`
    const domain = `[('size', '=', '${size}')]`
    this.openOrders(title, domain)
  }
}

AwesomeDashboard.components = { Layout, Card, PieChart };
AwesomeDashboard.template = "awesome_tshirt.clientaction";

registry.category("actions").add("awesome_tshirt.dashboard", AwesomeDashboard);
